package com.yangfan.thread.thread_wangwenjun02;

/**
 * @description: ThreadAPI 构造Thread 构造方法学习
 * @author: yangfan
 * @date: Created in 2020/1/22 0022 10:50
 * @modified By:
 */

public class ThreadConstructorAPI {


    /**
     * Thread 的构造方法主要参数
     * String name 线程名称 如果不指定线程名称的话 系统默认规则是 Thread- + nextThreadNum() 值从0 开始
     * Runnable target 任务
     * ThreadGroup group 线程组，默认如果不给线程组则会获取父类的线程组 main 线程的线程组
     * long stackSize 简单理解为 线程栈帧的 宽度 。每个线程都有他自己的 虚拟机栈。
     *      每个方法运行的时候 都会往 虚拟机栈内 压入栈帧  ，假如这个栈 默认能够放 100个 栈帧，
     *      stackSize 值如果 大了 ，那站内就放不了 100个 栈帧了， 如果  stackSize 值小的 话,
     *      虚拟机栈 内就能够放更多的栈帧。简单理解：栈帧的大小。
     *
     * @param args
     */

    private static int counter;//计数器


    public static void main(String[] args) {


        /**
         * 小实验：自定义 线程 不指定 stackSize 参数 与 指定后对比
         *
         * 线程 t1 不对 stackSize 进行限制 使用默认的。  运行次数29633
         * 线程 t2 进行设置  stackSize 参数 结果为
         *
         * stackSize = 100 = 22374 次运行
         * stackSize = 1000 = 11403 次运行
         * stackSize = 100000 = 980 次运行
         *
         * 结论： stackSize 的值越大 说明栈帧占用的 空间就更大，所以栈帧的容量就会减少
         */

//        Thread t1 = new Thread(()->{
//            try {
//                recursive(1);
//            }catch(Error error){
//                System.out.println(counter);//最后输出一下 调用的次数
//                error.printStackTrace();
//            }
//        });
//        t1.start();


        Thread t2 = new Thread(null,()->{
            try {
                recursive(1);
            }catch(Error error){
                System.out.println(counter);//最后输出一下 调用的次数
                error.printStackTrace();
            }
        },"test2",100000);
        t2.start();



    }

    /**
     * 递归操作
     * @param i
     */
    public static void recursive(int i){
        counter++;
        recursive(i +1);
    }


}
